/**
 * merge level=30
 */

Ext.define('Jfok.module.factory.ColumnsFactory', {

	statics : {
		getColumns : function(module, schemeOrderId) {

			var scheme = module.getGridScheme(schemeOrderId);
			var columns = [];
			// 是否有附件，有附件则加入附件按钮
			if (module.tf_hasAddition && module.tf_userRole.tf_additionBrowse)
				columns.push({
							locked : true,
							xtype : 'attachmentnumbercolumn',
							width : Ext.themeName === 'neptune' ? 36 : 28
						});

			// 是否模块具有审核功能
			if (module.tf_hasAuditing) {
				columns.push({
							locked : true,
							xtype : 'auditingactioncolumn',
							width : Ext.themeName === 'neptune' ? 36 : 28
						});
			}
			// 是否模块具有审批功能
			if (module.tf_hasApprove) {
				columns.push({
							locked : true,
							xtype : 'approveactioncolumn',
							width : Ext.themeName === 'neptune' ? 36 : 28
						});
			}
			
			// 是否模块具有支付功能
			if (module.tf_hasPayment) {
				columns.push({
							locked : true,
							xtype : 'payoutactioncolumn',
							width : Ext.themeName === 'neptune' ? 36 : 28
						});
			}
			
			if (module.tf_moduleName == '_Addition') {
				columns.push({
					dataIndex : 'tf_additionId',
					text : '预览',
					align : 'center',
					menuDisabled : true,
					sortable : true,
					width : 56,
					resizable : false,
					renderer : function(val, rd, model) {
						if (model.get('tf_filename'))
							return '<img height="16" width="16" src="attachment/preview.do?id='
									+ model.get('tf_additionId') + '" />'
						else
							return '<img height="16" width="16" src="" />'
					}
				});
			}

			for (var i in scheme.moduleGridSchemeGroups) {
				var sg = scheme.moduleGridSchemeGroups[i];
				// 是否需要分组
				var isgroup = sg.tf_isShowHeaderSpans;
				var group = {
					gridGroupId : sg.tf_gridGroupId,
					text : sg.tf_gridGroupName,
					locked : sg.tf_isLocked,
					flex : 1,
					columns : []
				}
				for (var j in sg.moduleGridSchemeGroupFields) {
					var gf = sg.moduleGridSchemeGroupFields[j];
					var fd = module.getFieldDefine(gf.tf_fieldId);
					var field;
					if (fd) {
						if (fd.tf_isHidden)
							continue;
						field = this.getColumn(gf, fd, module);
					} else { // 在附加字段中找
						var fd = module.getAdditionFieldDefine(gf.tf_fieldId);
						field = this.getColumn(gf, fd, module);
						if (field.dataIndex.search('C_') == 0) {
							field.moduleName = field.dataIndex.slice(2);
							field.renderer = this.childCountFieldRenderer;
						}
					}
					field.locked = sg.tf_isLocked;
					// 如果列显示字段有附加的属性，如renderer 可以放在这里加入进去
					if (gf.tf_otherSetting) {
						try {
							eval('Ext.apply(field,' + gf.tf_otherSetting + ')');
						} catch (err) {
						}
					}
					if (isgroup) {
						this.canReduceTitle(group, field);
						group.columns.push(field);
					} else
						columns.push(field);
				}
				if (isgroup) {
					this.canReduceTitle(group, field);
					columns.push(group);
				}
			}
			return columns;
		},

		// 看看分组名称是不是 下面column 的开头，如果是开头的话，并且columntitle 后面有内容，就把
		// 相同的部分截掉
		canReduceTitle : function(group, field) {
			if (field.text.indexOf(group.text) == 0) {
				field.text = field.text.slice(group.text.length).replace('(', '')
						.replace(')', '').replace('（', '').replace('）', '');
				if (field.text.indexOf("<br/>") == 0)
					field.text = field.text.slice(5);
			}
		},

		/**
		 * 根据groupField,fieldDefine的定义，生成一个column的定义
		 */
		getColumn : function(gf, fd, module) {

			// console.log(fd);
			var ft = fd.tf_title.replace(new RegExp('--', 'gm'), '<br/>');
			if (fd.behindText)
				ft += '<br/>(' + fd.behindText + ')';

			var field = {
				filter : {},
				maxWidth : 800,
				gridFieldId : gf.tf_gridFieldId, // 加上这个属性，用于在列改变了宽度过后，传到后台
				sortable : true,
				text : ft,
				dataIndex : (fd.baseField || fd.tf_aggregate)
						? fd.tf_fieldName
						: fd.manytoone_TitleName
			}
			if (gf.tf_ishidden)
				field.hidden = true;
			// 如果是此人可以审批的字段，那么加上一个可以审批的标记
			if (module.tf_hasApprove && module.tf_userRole.tf_approveOrder >= 1) {
				if (field.dataIndex.indexOf('tf_sh') == 0
						&& field.dataIndex.substr(field.dataIndex.length - 1, 1) == module.tf_userRole.tf_approveOrder)
					field.text = '<span class="approvethisgridheadicon" >'
							+ '<img src="images/approve/approve_edit.png" />' + fd.tf_title
							+ '</span>';
			}

			// String("String"), Boolean("Boolean"), Integer("Integer"),
			// Date("Date") Datetime, Double("Double"), Float("Float"); Percent
			switch (fd.tf_fieldType) {
				case 'Date' :
					Ext.apply(field, {
								xtype : 'datecolumn',
								align : 'center',
								width : 100,
								renderer : Jfok.system.dateRenderer
							});
					break;

				case 'Datetime' :
					Ext.apply(field, {
								xtype : 'datecolumn',
								align : 'center',
								width : 130,
								renderer : Jfok.system.datetimeRenderer
							});
					break;

				case 'Boolean' :
					field.xtype = 'checkcolumn';
					field.stopSelection = false;
					field.processEvent = function(type) {
						if (type == 'click')
							return false;
					};
					break;
				case 'Integer' :
					Ext.apply(field, {
								align : 'center',
								xtype : 'numbercolumn',
								tdCls : 'intcolor',
								format : '#',
								renderer : Jfok.system.intRenderer
							});
					break;
				case 'Double' :
					Ext.apply(field, {
								align : 'center',
								xtype : 'numbercolumn',
								width : 110,
								renderer : Jfok.system.moneyRenderer
							});
					break;
				case 'Float' :
					Ext.apply(field, {
								align : 'center',
								xtype : 'numbercolumn',
								width : 110,
								renderer : Jfok.system.moneyRenderer
							});
					break;
				case 'Percent' :
					Ext.apply(field, {
								align : 'center',
								xtype : 'numbercolumn',
								width : 110,
								renderer : Jfok.system.percentRenderer
							})
					break;
				case 'String' :
					if (module.tf_nameFields == fd.tf_fieldName)
						Ext.apply(field, {
									text : '<span class="gridheadicon" >'
											+ '<img src="images/button/namefield.png" />'
											+ fd.tf_title + '</span>',
									renderer : this.nameFieldRenderer,

									summaryType : 'count',
									summaryRenderer : function(value) {
										return Ext.String.format('小计 ( {0} 条记录)', value);
									}

								});
					else
						Ext.apply(field, {
									renderer : Jfok.system.defaultRenderer
								});

					// if (!fd.l) { // sqlserver 不可以用text 字段排序 //全改成了
					// nvarchar(MAX)
					// field.sortable = false;
					// field.groupable = false;
					// field.menuDisabled = true;
					// }
					break;

				default :
					// 没有找到基础字段类型, 应该是一个manytone的模块，加入其id 和 name
					// var parentModule =
					// Jfok.system.getModuleInfoWithName(fd.tf_fieldType);
					// if (parentModule){
					//							
					// }

					break;
			}
			if (fd.s) { // tf_allowSummary
				Ext.apply(field, {
							hasSummary : true,
							summaryType : 'sum'
						})
			}

			if (gf.tf_columnWidth > 0)
				field.width = gf.tf_columnWidth;
			else if (gf.tf_columnWidth == -1) {
				field.flex = 1;
				field.minWidth = 120;
			}
			if (fd.manytoone_TitleName) {
				var pmodule = Jfok.modules.getModuleInfoWithName(fd.tf_fieldType);
				var icon = '';
				if (pmodule && pmodule.iconURL)
					icon = '<img src="' + pmodule.iconURL + '" />';
				Ext.apply(field, {
							renderer : Jfok.system.manytoOneFieldRenderer,
							text : '<span class="gridheadicon" >' + icon + fd.tf_title
									+ '</span>',
							manytooneIdName : fd.manytoone_IdName,
							moduleName : fd.tf_fieldType
						})
			}
			// 如果一个字段是一个附加字段，这个字段正好是父模块的父模块的一个namefileds字段，那么也要加成单击可以显示的功能
			// P__t1020___tf_title,例如这样的
			if (Ext.String.startsWith(fd.tf_fieldName, "P_")) {
				var fn = fd.tf_fieldName;
				var ppAsName = fn.substring(2, 8);
				var pmodule = Jfok.modules.getModuleInfoWithAsName(ppAsName);

				if (Ext.String.endsWith(fn, pmodule.tf_nameFields)) {
					var icon = '';
					if (pmodule && pmodule.iconURL)
						icon = '<img src="' + pmodule.iconURL + '" />';
					Ext.apply(field, {
								renderer : Jfok.system.manytoOneFieldRenderer,
								text : '<span class="gridheadicon" >' + icon
										+ fd.tf_title.replace(new RegExp('--', 'gm'), '<br/>')
										+ '</span>',
								manytooneIdName : pmodule.tableAsName + '___'
										+ pmodule.tf_primaryKey,
								moduleName : pmodule.tf_moduleName
							})
				}
			}
			return field;
		},

		/**
		 * 对于当前模块的name字段，加粗显示
		 */

		nameFieldRenderer : function(val, rd, model, row, col, store, gridview) {
			return filterTextSetBk(store, '<strong>' + val + '</strong>');
		},

		/**
		 * 对于一个子模块的count字段，在其 count数字 上加一个超链，点击可以显示此模块的记录
		 */
		childCountFieldRenderer : function(val, rd, model, row, col, store,
				gridview) {
			try {
				var column = gridview.headerCt.columnManager.columns[col];
				var ss = '<span class="gridNameField">'
						+ '<a onclick="javascript:Jfok.mainRegion.addParentFilterModule(\''
						+ column.moduleName + '\',\'' + model.module.tf_moduleName
						+ '\',\'' + model.get(model.idProperty) + '\',\''
						+ model.getTitleTpl() + '\'' + ');return false;" href="#">'
						+ '<span class="childalignright">'
						+ (val == '0' ? '' : val) + ' </span>' + '</a></span>';
				return ss;
			} catch (err) {
				return val;
			}
		}
	}

});
